package com.tedu.element.bubble;

import com.tedu.element.ElementObj;
import com.tedu.manager.GameLoad;
import com.tedu.show.GameConstants;

import javax.swing.*;
import java.awt.*;

/**
 * @说明 爆炸效果类 - 实现方向性水柱效果（上/下/左/右）
 */
public class Explosion extends ElementObj {
    private static final int EXPLOSION_DURATION = GameConstants.EXPLOSION_DURATION; // 爆炸持续时间（帧数）
    private int timer = 0;
    
    // 爆炸类型
    public enum ExplosionType {
        CENTER,      // 中心爆炸
        UP,          // 向上水柱
        DOWN,        // 向下水柱
        LEFT,        // 向左水柱
        RIGHT,       // 向右水柱
        UP_END,      // 向上水柱末端
        DOWN_END,    // 向下水柱末端
        LEFT_END,    // 向左水柱末端
        RIGHT_END    // 向右水柱末端
    }
    
    private ExplosionType type; // 爆炸类型

    // str = "x,y,type"
    @Override
    public ElementObj createElement(String str) {
        String[] split = str.split(",");

        int tileSize = GameConstants.TILE_SIZE;
        // 设置位置和大小
        this.setGridX(Integer.parseInt(split[0]));
        this.setGridY(Integer.parseInt(split[1]));
        this.setW(tileSize);
        this.setH(tileSize);
        // 设置爆炸类型
        this.type = ExplosionType.valueOf(split[2]);
        // 加载图片
        loadSpriteImage();

        return this;
    }

    /**
     * 根据爆炸类型加载对应图片
     */
    private void loadSpriteImage() {
        String groupName = "explosion";
        String stateName = this.type.toString().toLowerCase();

        // 获取精灵图
        ImageIcon spriteIcon = GameLoad.groupImgMap.get(groupName).get(stateName);
        if (spriteIcon == null) {
            System.err.println("道具精灵图未找到: " + stateName);
            return;
        }
        this.setIcon(spriteIcon);
    }

    @Override
    public void showElement(Graphics g) {
        if (this.getIcon() != null) {
            g.drawImage(this.getIcon().getImage(), getX(), getY(), getW(), getH(), null);
            
             // 调试模式显示碰撞框
             if (GameConstants.DEBUG_MODE) {
                 g.setColor(new Color(255, 0, 0, 100));
                 Rectangle rect = getRectangle();
                 g.fillRect(rect.x, rect.y, rect.width, rect.height);
             }
        }
    }

    @Override
    protected void updateImage(long time) {
        timer++;
        if (timer >= EXPLOSION_DURATION) {
            this.setLive(false); // 爆炸结束
        }
    }
    
    /**
     * 重写碰撞区域 - 根据爆炸类型调整
     */
    @Override
    public Rectangle getRectangle() {
        int shrink = 5; // 内缩值，使碰撞区域小于视觉效果
        int x = getX() + shrink;
        int y = getY() + shrink;
        int width = getW() - shrink * 2;
        int height = getH() - shrink * 2;
        
        // 根据爆炸类型调整碰撞区域
        switch (type) {
            case UP:
            case DOWN:
                // 垂直方向水柱 - 增加高度碰撞区域
                int verticalExpand = GameConstants.TILE_SIZE / 2;
                return new Rectangle(
                    x, 
                    y - verticalExpand, 
                    width, 
                    height + verticalExpand * 2
                );
            case LEFT:
            case RIGHT:
                // 水平方向水柱 - 增加宽度碰撞区域
                int horizontalExpand = GameConstants.TILE_SIZE / 2;
                return new Rectangle(
                    x - horizontalExpand, 
                    y, 
                    width + horizontalExpand * 2, 
                    height
                );
            case UP_END:
            case DOWN_END:
            case LEFT_END:
            case RIGHT_END:
                // 末端爆炸 - 标准碰撞区域
                return new Rectangle(x, y, width, height);
            default:
                // 中心爆炸 - 标准碰撞区域
                return new Rectangle(x, y, width, height);
        }
    }
    
    /**
     * 获取爆炸类型
     */
    public ExplosionType getType() {
        return type;
    }
}